/*
functie code van het object "commandLineOptions"
Gescheven door SanderD (alle bugs melden op demeester.sander@gmail.com).

Enjoy life!
*/


commandLineOptions::commandLineOptions() {
  port = 10233;
  type = SERVER;
  ip = "127.0.0.1";
};
void commandLineOptions::cliParser(int nummerArgumenten, char *arguments[])
{
  //start command line parsing
  int temp = nummerArgumenten;
  if(temp > 0) {
  while(temp != 0){
    //parse commandLineOptioins
    if(string(arguments[temp]) == "--help" || string(arguments[temp]) == "--HELP" || string(arguments[temp]) == "/?"){
      helpScherm();
    }
    if(string(arguments[temp]) == "--server" || string(arguments[temp]) == "--SERVER"){
      type = SERVER;
    }
    if(string(arguments[temp]) == "--client" || string(arguments[temp]) == "--CLIENT"){
      type = CLIENT;
    }
    if(string(arguments[temp]) == "--ip" || string(arguments[temp]) == "--IP"){
	  if(isValidIp(arguments[(temp+1)]))
	    ip = arguments[(temp+1)];
      else 
	ip = "127.0.0.1";
    }
    if(string(arguments[temp]) == "--port" || string(arguments[temp]) == "--PORT"){
      if(atoi(arguments[(temp+1)]) < 65535)
	port = atoi(arguments[(temp+1)]);
      }
    temp--;
      }
    }else{
      helpScherm();
  }
};

void commandLineOptions::helpScherm(){
    std::cout << "----------------------------------------\n";
    std::cout << "               SnowMonky\n";
    std::cout << "----------------------------------------\n";
    std::cout << " Geschreven door SanderD\n";
    std::cout << "----------------------------------------\n";

    std::cout << "Help screen for SnowMonky\n\n";
    std::cout << "list of avalibale command line options:\n\n";

    std::cout << "--server \t\t\t" << "Put snowmonky in server mode\n";
    std::cout << "--client \t\t\t" << "Put snowmonky in client mode\n";
    std::cout << "--ip \t\t\t" <<     "For client's, this gives the ip to connect to\n";
    std::cout << "\t\t\t\t For server's its the ip_interface to lissing on\n";
    std::cout << std::endl;

    std::cout << "--port \t\t\t\t\t" << "port override, default port is 10233. Rember ports below 1024 need root.\n";
    std::cout << "\t\t\t\t Verlog komt :)\n";
    exit(1);
};

void commandLineOptions::showConfig(){
  cout << "port: " << port << endl;
  cout << "type: " << type << endl;
  cout << "ip: " << ip << endl;
};

bool commandLineOptions::isValidIp(char *ip){
  //declare vars die we nodig  hebben.
  size_t pos[4] = {'0'}; //4
  size_t len;
  string ipString(&ip[0]); //de string waarin we een kopie maken van wat we gaan gebruiken.
  char buffer[20] = {'\0'}; //de buffer waar we alles tijdelijke naar toe gaan copy'n.
  int counter = 0; //De counter die kijkt wat onze huidige positie is in de loop.
  bool check[4] = {false}; //om te kijken of het getal dat we halen wel voldoet een de gegeven van een geldige byte van een ipv4 adres.
  int ipElements[4] = {'\0'}; //4

  //----------------Kijken of er een punt is in de string.
  if(string::npos == ipString.find('.'))
    return false; //stop de methode hier. Het is geen valid ipv4 want is er geen punt. return false en gebruik 127.0.0.1 
  //---------------END

  //--------------Start de while loop
  while(counter != 4){ //3, als een je niet goed bent in c :) vergeet onze 0 niet hé
    pos[counter] = ipString.find(".", 1); //vind de eerste punt in de buffer.
    ipString.copy(&buffer[0], int((pos[counter])), 0); //copy eerste stuk tot aan . naar buffer
    ipElements[counter] = atoi(&buffer[0]); //van buffer naar array.
    memset(&buffer[0], '\0', 20);
    ipString.erase(0, int((pos[counter])+1));
    
    if(ipElements[counter] >= ipElements[counter] && ipElements[counter] <= 255){
      check[counter] = true;
    }

    else{
          return false;
    }
    
    counter++;
  }
  if(check[0] == true && check[1] == true && check[2] == true && check[3] == true){
	return true;
  }
      else
	return false;
    
};

